# encoding: utf-8
#  创建日期：2017.11.22
#  作者：zhangjian
#  摘要：使用selenium做web自动化测试

#
# CtrlWeb类,用于模拟页面的自动化操作
#
class CtrlWeb
  def initialize(config) # 创建对象时调用,可接收new时的参数
    Log.info('------------ CtrlWeb.initialize Start ------------')
    @device_ip = config['device_ip']
    @page_user = config['page_user']
    @page_pass = config['page_pass']

    # 定义驱动文件位置
    Selenium::WebDriver::Chrome.driver_path = '../lib/chromedriver.exe'
    @wait = Selenium::WebDriver::Wait.new(timeout: 10) # 查找元素可等待10秒
  end

  # 执行登录操作
  def do_login
    Log.info('------------ CtrlWeb.do_login Start ------------')
    # chrome设置选项,自动忽略证书错误,禁用阻止弹出窗口,禁用翻译
    options = Selenium::WebDriver::Chrome::Options.new(args: %w('headless', 'disable-gpu', 'ignore-certificate-errors', 'disable-popup-blocking', 'disable-translate'))
    $driver = Selenium::WebDriver.for :chrome, options: options
    $driver.manage.timeouts.implicit_wait = 3 # 隐式等待元素3秒
    $driver.navigate.to "https://#{@device_ip}/SPM/index-private.php" # 定位到登录页面
    $driver.find_element(name: 'username').send_keys @page_user # 输入用户名
    $driver.find_element(name: 'password').send_keys @page_pass # 输入密码
    $driver.find_element(class: 'login-btn').click #点击登录按钮

    # 首页html源码最底下的一个div,如果能显示则说明整个页面加载成功
    @wait.until {$driver.find_element(class: 'nano-slider').displayed?}
  end

  # 点击顶部的菜单,传入参数为点击位置的名称
  def click_top_menu(menu = '')
    Log.info('------------ CtrlWeb.click_top_menu Start ------------')
    # div位置和名字对应hash,字符串做键时目前要使用(''=>0)的方式,ide告警可以不管
    top_menu_hash = {'帮助' => 0, '首页' => 1, '我的设备' => 2, '消息' => 3, '数据分析' => 4, '智能策略' => 5, '基础运维' => 6}
    top_menu = Array.new # 保存查找到的7个顶部菜单
    while top_menu.size != 7
      top_menu = $driver.find_elements(class: 'topMenu-item')
      sleep(5) # 每隔5秒查找顶部菜单,必须要有7个才成功
    end
    click_menu = top_menu_hash[menu] # 如果传入menu不在hash中,则得到nil
    unless click_menu.nil?
      top_menu[click_menu].click # 不为nil则点击
      Log.info("click #{menu} succeed...")
    end
  end


  # 关闭方法
  def close
    Log.info('------------ CtrlWeb.close Start ------------')
    $driver.quit unless $driver.nil? # 不为nil则退出
    $driver = nil # 全局变量置空
  end
end
